﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Joel.Vishnu.Presentacion.Vistas;
using Joel.Vishnu.Modelo.Enumeradores;
using Joel.Vishnu.Modelo.Entidades;
using Joel.Vishnu.Repositorios;

namespace Joel.Vishnu.Presentacion
{
    public class ClientesPresentador
    {
        #region Constructores

        public ClientesPresentador(IClientes vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        private IClientes vista;

        #endregion

        #region Propiedades

        private RepositorioCliente RepositorioCliente
        {
            get { return new RepositorioCliente(); }
        }

        private RepositorioBarrio RepositorioBarrio
        {
            get { return new RepositorioBarrio(); }
        }

        private RepositorioFactura RepositorioFactura
        {
            get { return new RepositorioFactura(); }
        }

        private RepositorioGenero RepositorioGenero
        {
            get { return new RepositorioGenero(); }
        }

        #endregion

        #region Metodos

        public void ActualizarBarrios()
        {
            vista.ListaBarrios = (from item in RepositorioBarrio.DevolverTodos()
                                  orderby item.Nombre ascending
                                  select item).ToList();
        }

        public void ActualizarClientes()
        {
            vista.ListaClientes = (from item in RepositorioCliente.DevolverTodos()
                                   orderby item.ApellidoNombre ascending
                                   select item).ToList();
        }

        public void Inicializar()
        {
            ActualizarBarrios();
            ActualizarClientes();
        }

        public void Aceptar()
        {
            if (vista.Estado == EnumEstado.MODIFICAR && vista.ClienteId == (Int32)EnumClientes.CLIENTE_POR_DEFECTO)
                throw new Exception("No se puede modificar un cliente por defecto.");
            if (vista.Nombre.Trim() == String.Empty)
                throw new Exception("El nombre no puede quedar vacio.");
            if (vista.Apellido.Trim() == String.Empty)
                throw new Exception("El apellido no puede quedar vacio.");
            if (vista.Dni == 0)
                throw new Exception("El DNI no puede quedar vacio.");
            if (Convert.ToString(vista.Dni).Length < 8)
                throw new Exception("El DNI no puede quedar incompleto.");
            if (vista.FechaCumpleanos > DateTime.Now.AddYears(-18))
                throw new Exception("El cliente no puede ser menor a 18 años.");
            var genero = RepositorioGenero.DevolverPorId(vista.GeneroId);
            if (genero == null)
                throw new Exception("El genero no existe.");
            if (vista.Email.Trim() == String.Empty)
                throw new Exception("El email no puede quedar vacio.");
            if (vista.Telefono.Trim() == String.Empty)
                throw new Exception("El telefono no puede quedar vacio.");
            if (vista.Direccion.Trim() == String.Empty)
                throw new Exception("El direccion no puede quedar vacio.");
            var barrio = RepositorioBarrio.DevolverPorId(vista.BarrioId);
            if (barrio == null)
                throw new Exception("El barrio no existe.");
            if (vista.FechaPrimeraCompra > DateTime.Now)
                throw new Exception("La fecha de primera compra no puede ser mayor a la fecha actual.");
            switch (vista.Estado)
            {
                case EnumEstado.NUEVO:
                    {
                        Cliente cliente = new Cliente();
                        cliente.Nombre = vista.Nombre;
                        cliente.Apellido = vista.Apellido;
                        cliente.Dni = vista.Dni;
                        cliente.FechaCumpleanos = vista.FechaCumpleanos;
                        cliente.Genero = genero;
                        cliente.Email = vista.Email;
                        cliente.Telefono = vista.Telefono;
                        cliente.Direccion = vista.Direccion;
                        cliente.Barrio = barrio;
                        cliente.FechaPrimeraCompra = vista.FechaPrimeraCompra;
                        RepositorioCliente.Insertar(cliente);
                        break;
                    }
                case EnumEstado.MODIFICAR:
                    {
                        Cliente cliente = RepositorioCliente.DevolverPorId(vista.ClienteId);
                        if (cliente == null)
                            throw new Exception("El cliente no existe.");
                        cliente.Nombre = vista.Nombre;
                        cliente.Apellido = vista.Apellido;
                        cliente.Dni = vista.Dni;
                        cliente.FechaCumpleanos = vista.FechaCumpleanos;
                        cliente.Genero = genero;
                        cliente.Email = vista.Email;
                        cliente.Telefono = vista.Telefono;
                        cliente.Direccion = vista.Direccion;
                        cliente.Barrio = barrio;
                        cliente.FechaPrimeraCompra = vista.FechaPrimeraCompra;
                        RepositorioCliente.Modificar(cliente);
                        break;
                    }
            }
            Inicializar();
        }

        public void Eliminar()
        {
            if (vista.ClienteId == (Int32)EnumClientes.CLIENTE_POR_DEFECTO)
                throw new Exception("No se puede eliminar un cliente por defecto.");
            Cliente cliente = RepositorioCliente.DevolverPorId(vista.ClienteId);
            if (cliente == null)
                throw new Exception("El cliente no existe.");
            if (RepositorioFactura.DevolverTodos().Where(x => x.Cliente.Id == cliente.Id).FirstOrDefault() != null)
                throw new Exception("No puede eliminarse el cliente por estar vinculado a una factura.");
            RepositorioCliente.Eliminar(cliente);
            vista.ListaClientes = RepositorioCliente.DevolverTodos();
        }

        public Barrio TraerBarrioPorId(Int32 barrioId)
        {
            Barrio entidad = RepositorioBarrio.DevolverPorId(barrioId);
            return entidad;
        }

        #endregion
    }
}
